%ifndef __ASM_GENERIC_SOCKET_INC
%define __ASM_GENERIC_SOCKET_INC   1

%include "bits/sockios.inc"
%include "bits/socket_type.inc"

; For setsockopt(2)

    %define SOL_SOCKET             1
    %define SO_DEBUG             1
    %define SO_REUSEADDR         2
    %define SO_TYPE                 3
    %define SO_ERROR             4
    %define SO_DONTROUTE         5
    %define SO_BROADCAST         6
    %define SO_SNDBUF             7
    %define SO_RCVBUF             8
    %define SO_SNDBUFFORCE        32
    %define SO_RCVBUFFORCE        33
    %define SO_KEEPALIVE         9
    %define SO_OOBINLINE        10
    %define SO_NO_CHECK            11
    %define SO_PRIORITY            12
    %define SO_LINGER            13
    %define SO_BSDCOMPAT        14
    %define SO_REUSEPORT        15
    
%ifndef SO_PASSCRED      ; powerpc only differs in these
    %define SO_PASSCRED            16
    %define SO_PEERCRED            17
    %define SO_RCVLOWAT            18
    %define SO_SNDLOWAT            19
    %define SO_RCVTIMEO            20
    %define SO_SNDTIMEO            21
%endif

; Security levels - as per NRL IPv6 - don't actually do anything
    %define SO_SECURITY_AUTHENTICATION            22
    %define SO_SECURITY_ENCRYPTION_TRANSPORT    23
    %define SO_SECURITY_ENCRYPTION_NETWORK        24
    %define SO_BINDTODEVICE                        25

; Socket filtering
    %define SO_ATTACH_FILTER        26
    %define SO_DETACH_FILTER        27
    %define SO_GET_FILTER            SO_ATTACH_FILTER
    %define SO_PEERNAME                28
    %define SO_TIMESTAMP            29
    %define SCM_TIMESTAMP            SO_TIMESTAMP
    %define SO_ACCEPTCONN            30
    %define SO_PEERSEC                31
    %define SO_PASSSEC                34
    %define SO_TIMESTAMPNS            35
    %define SCM_TIMESTAMPNS            SO_TIMESTAMPNS
    %define SO_MARK                    36
    %define SO_TIMESTAMPING            37
    %define SCM_TIMESTAMPING        SO_TIMESTAMPING
    %define SO_PROTOCOL                38
    %define SO_DOMAIN                39
    %define SO_RXQ_OVFL                40
    %define SO_WIFI_STATUS            41
    %define SCM_WIFI_STATUS            SO_WIFI_STATUS
    %define SO_PEEK_OFF                42

; Instruct lower device to use last 4-bytes of skb data as FCS
    %define SO_NOFCS               43
    %define SO_LOCK_FILTER         44
    %define SO_SELECT_ERR_QUEUE    45
    %define SO_BUSY_POLL           46
    %define SO_MAX_PACING_RATE     47
    %define AF_INET                2
    %define AF_LOCAL               1
    %define SOCK_STREAM            1
    %define PF_INET                2
    %define PF_LOCAL               1
    %define IPPROTO_IP             0
    %define IPPROTO_TCP            6
    %define IPPROTO_UDP            17
    %define INADDR_ANY             0

struc STRUC_SOCKETADDR_IN
   .sin_family:    resw 1
   .sin_port:      resw 1
   .sin_addr:      resd 1
   .sin_pad:       resb 8
endstruc

; SOCKETADDR_IN takes one mandatory parameter %1 which is the name of the data structure.
; The remaining refers to the family, port, addr and aren't mandatory. sin.pad is not used and is
; for padding bytes only
; When no values are given for family, port and addr then they defaults to zero.
%macro SOCKETADDR_IN 1-4 0,0,0
    %1:  istruc STRUC_SOCKETADDR_IN
        at  STRUC_SOCKETADDR_IN.sin_family,  dw %2
        at  STRUC_SOCKETADDR_IN.sin_port,    dw %3
        at  STRUC_SOCKETADDR_IN.sin_addr,    dd %4
        at  STRUC_SOCKETADDR_IN.sin_pad,     times 8 db 0
        iend

    %define %1.sin_family   %1+STRUC_SOCKETADDR_IN.sin_family
    %define %1.sin_port     %1+STRUC_SOCKETADDR_IN.sin_port
    %define %1.sin_addr     %1+STRUC_SOCKETADDR_IN.sin_addr
    %define %1.size         STRUC_SOCKETADDR_IN_size
%endmacro

%endif ; __ASM_GENERIC_SOCKET_INC
